package com.webermagem.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.hibernate.Session;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

import com.webermagem.DAO.DiagnosticoDAO;
import com.webermagem.DAO.SintomaDAO;
import com.webermagem.model.Diagnostico;
import com.webermagem.model.DiagnosticoDataModel;
import com.webermagem.model.Sintoma;
import com.webermagem.util.SessionManager;

@ManagedBean
@SessionScoped
public class DiagnosticoController implements Serializable {

	private static final long serialVersionUID = 1L;

	private Diagnostico novoDiagnostico = new Diagnostico();
	private Diagnostico diagnostico;
	private Diagnostico diagnosticoPesq = new Diagnostico();
	private List<Diagnostico> listaDiagnosticos;
	private List<SelectItem> listaSintomas;
	private DiagnosticoDataModel diagnosticoModel;
	private DiagnosticoDAO diagnosticoDao = new DiagnosticoDAO();
	private SintomaDAO sintomaDao = new SintomaDAO();
	
	private Set<Sintoma> sintomasSelecionados = new HashSet<Sintoma>();

	private Sintoma sintomaSelecionado = new Sintoma();
	
	// ADICIONA
	public void adicionarDiagnostico(ActionEvent actionEvent){
		
//		Set<Sintoma> sintomaAux = new HashSet<Sintoma>();
//		
//		sintomaAux.add(sintomaSelecionado);
//		
//		novoDiagnostico.setSintomas(sintomaAux);
		
		novoDiagnostico.setSintomas(sintomasSelecionados);
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("user", novoDiagnostico);
		
		diagnosticoDao.save((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), novoDiagnostico);
		
		facesContext.addMessage(null, new FacesMessage("Sucesso", "Diagnostico adicionado com Sucesso!"));
		novoDiagnostico = new Diagnostico();
		
	}
	
    public void onRowSelect(SelectEvent event) {
    	diagnostico = (Diagnostico)(diagnosticoModel.getRowData());
    }
    
	// ALTERA
	public void alterarDiagnostico(ActionEvent actionEvent){
		
//		Set<Sintoma> sintomaAux = new HashSet<Sintoma>();
//		
//		sintomaAux.add(sintomaSelecionado);
//		
//		novoDiagnostico.setSintomas(sintomaAux);
		
		novoDiagnostico.setSintomas(sintomasSelecionados);
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		diagnosticoDao.update((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), diagnostico);
		  
		facesContext.addMessage(null, new FacesMessage("Sucesso", "Diagnostico atualizado com Sucesso!"));
	}

	// EXCLUIR
	public void excluirDiagnostico(ActionEvent actionEvent){
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		diagnosticoDao.remove((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), diagnostico);
		  
		facesContext.addMessage(null, new FacesMessage("Sucesso", "Diagnostico excluido com Sucesso!"));
	}
	
	// CONSULTAR
	public void pesquisarDiagnostico(ActionEvent actionEvent){
		
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("user", diagnosticoPesq);
		
	}
	
	// GETS E SETTERS

	public DiagnosticoDAO getDiagnosticoDao() {
		return diagnosticoDao;
	}

	public void setDiagnosticoDao(DiagnosticoDAO diagnosticoDao) {
		this.diagnosticoDao = diagnosticoDao;
	}

	public Diagnostico getDiagnostico() {
		return diagnostico;
	}

	public void setDiagnostico(Diagnostico diagnostico) {
		this.diagnostico = diagnostico;
	}

	public DiagnosticoDataModel getDiagnosticoModel() {
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		if(diagnosticoPesq == null ||  diagnosticoPesq.getDescricao() == null || diagnosticoPesq.getDescricao().equals("") ) {
			
			listaDiagnosticos = (List<Diagnostico>) diagnosticoDao.listOrdenado((Session)SessionManager.getSessionAttribute(facesContext, "transacao"));
			
			listaSintomas = new ArrayList<SelectItem>();
			for (Object objeto : sintomaDao.list((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), " from Sintoma ")) {
				Sintoma sintoma = (Sintoma)objeto;
	            listaSintomas.add(new SelectItem(sintoma, sintoma.getDescricao()));  
	        } 
			
		} else {
			
			listaDiagnosticos = diagnosticoDao.listByDescricao((Session)SessionManager.getSessionAttribute(facesContext, "transacao"), diagnosticoPesq.getDescricao());
			
		}
		
		diagnosticoModel = new DiagnosticoDataModel(listaDiagnosticos);
		
		return diagnosticoModel;
		
	}

	public void setDiagnosticoModel(DiagnosticoDataModel diagnosticoModel) {
		this.diagnosticoModel = diagnosticoModel;
	}

	public List<Diagnostico> getListaDiagnosticos() {
		return listaDiagnosticos;
	}

	public void setListaDiagnosticos(List<Diagnostico> listaDiagnosticos) {
		this.listaDiagnosticos = listaDiagnosticos;
	}

	public Diagnostico getNovoDiagnostico() {
		return novoDiagnostico;
	}

	public void setNovoDiagnostico(Diagnostico novoDiagnostico) {
		this.novoDiagnostico = novoDiagnostico;
	}

	public Diagnostico getDiagnosticoPesq() {
		return diagnosticoPesq;
	}

	public void setDiagnosticoPesq(Diagnostico diagnosticoPesq) {
		this.diagnosticoPesq = diagnosticoPesq;
	}

	public List<SelectItem> getListaSintomas() {
		return listaSintomas;
	}

	public void setListaSintomas(List<SelectItem> listaSintomas) {
		this.listaSintomas = listaSintomas;
	}

	public Sintoma getSintomaSelecionado() {
		return sintomaSelecionado;
	}

	public void setSintomaSelecionado(Sintoma sintomaSelecionado) {
		this.sintomaSelecionado = sintomaSelecionado;
	}

	public Set<Sintoma> getSintomasSelecionados() {
		return sintomasSelecionados;
	}

	public void setSintomasSelecionados(Set<Sintoma> sintomasSelecionados) {
		this.sintomasSelecionados = sintomasSelecionados;
	}
	
}